/*
 * $LastChangedDate: 2007-06-20 13:51:30 +0200 (Wed, 20 Jun 2007) $
 * $LastChangedRevision: 195 $
 * $LastChangedBy: david $
 */


#ifndef _FILELOCK_H_
#define _FILELOCK_H_

#include <vector>
using namespace std;

#include "BlockingObject.h"
#include "FileMngr.h"

class FileMngr;

class FileLock : public BlockingObject 
{
public:
	FileLock();
	virtual ~FileLock();
	void readLock(FileMngr *reader);
	void writeLock(FileMngr *writer);
	void unlock(FileMngr *fm);

private:
	/* Cola de threads que esperan por el lock */
	vector<pthread_t> queue;

	/* Los lectores que bloquean el lock */
	vector<pthread_t> readers;

	/* El escritor que bloquea el lock */
	pthread_t currentWriter;

	bool writeLocked();
	bool readLocked();
	void remove(vector<pthread_t> &v, pthread_t pth);
	bool contains(vector<pthread_t> v, pthread_t pth);
};

#endif /* _FILELOCK_H_ */
